데이터 모델링과 성능

성능 데이터 모델링

성능 데이터 모델링이란 데이터베이스 성능 향상을 목적으로 설계단계부터 정규화, 역정규화, 테이블 통합, 테이블 분할, 조인구조, PK, FK 등 여러가지 성능과 관련된 사항이 데이터 모델링에 반영될 수 있도록 하는것이다.

성능 데이터 모델링 수행시점

  • 분석/설계단계에서 데이터베이스의 처리 성능을 향상시킬 수 있는 방법을 고민해야 한다.
  • 이 고려를 분석/설계 단계때 하지 않으면 시간이 지날수록 성능개선의 비용이 증가한다.

성능 데이터 모델링 고려사항

  • 데이터 모델링시 정규화를 정확하게 수행한다.
  • 데이터베이스 용량산정을 수행한다.
  • 데이터베이스에 발생되는 트랜잭션의 유형을 파악한다.
  • 용량과 트랜잭션의 유형에 따라 역정규화를 수행한다.
  • 이력모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
  • 성능관점에서 데이터 모델을 검증한다.


정규화(Normalization)

정규화란 데이터를 결정하는 결정자(Determinant)에 의해 함수적 종속성을 가지고 있는 일반속성을 의존자(Dependent)로 하여 삽입/갱신/삭제 이상을 제거하는 것이다. 데이터의 중복속성을 제거하고 결정자에 의해 동일한 의미의 일반속성이 하나의 테이블로 집약되므로 데이터 용량이 최소화되는 효과가 있다.

이상(Anomaly) 현상

  • 삽입 이상: 데이터 삽입시 의도와 관계없이 불필요한 값들도 함께 삽입되는 현상
  • 갱신 이상: 속성값 갱신시 중복 레코드 중 일부 레코드의 정보만 갱신되어 데이터에 모순이 생기는 현상
  • 삭제 이상: 레코드 삭제시 의도와 관계없는 값들도 함께 삭제되는 데이터 손실 현상

함수적 종속성(Functional Dependency)

함수적 종속성이란 결정자에 의해 데이터들이 종속되는 현상을 지칭한다. 함수적 종속성은 데이터가 가지고 있는 근본적인 속성으로, 이를 이용하여 정규화 작업이나 각 오브젝트에 속성을 배치한다.

  • 이름, 출생지, 주소는 주민등록번호에 함수적 종속성을 가지고 있다.
  • 결정자 주민등록번호 $\rightarrow$ 종속자 {이름, 출생지, 주소}

정규화 과정

구분 설명
제1정규화 (비정규화 테이블 $\rightarrow$ 제1정규형) 비정규화 테이블에서 반복 속성 제거, 모든 속성이 원자값을 가짐
제2정규화 (제1정규형 $\rightarrow$ 제2정규형) 부분함수 종속성 제거
제3정규화 (제2정규형 $\rightarrow$ 제3정규형) 이행함수 종속성 제거, 키가 아닌 모든 속성이 기본키에 직접 종속
BCNF (제3정규형$\rightarrow$BCNF형) 후보키가 아닌 결정자 제거, 모든 결정자가 후보키
제4정규화 (BCNF형$\rightarrow$제4정규형) 다치 종속 제거
제5정규화 (제4정규형$\rightarrow$제5정규형) 조인 종속성 이용

정규화 테이블의 성능저하 관련

정규화가 잘 되어 있으면 삽입/갱신/삭제의 성능이 향상되고 역정규화를 많이 하면 조회 성능이 향상된다. 하지만 역정규화만이 조회 성능을 향상시키는 것은 아니며 정규화를 해야만 성능이 향상되는 경우가 많다.

  • 2차 정규화를 적용한 테이블의 조인: PK Unique Index를 이용하므로 조인에 의한 성능 저하는 미미하다.


역정규화(Denormalization)

데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되거나 경로가 너무 멀어 조인으로 인한 성능저하가 예상되거나 칼럼을 계산하여 읽을 때 성능이 저할될 것이 예상되는 경우 역정규화를 수행한다.

역정규화 절차: (1) 대상조사 $\rightarrow$ (2) 다른 방법유도 검토 $\rightarrow$ (3) 역정규화 적용

(1) 역정규화 대상조사

전체 데이터의 양을 조사하고 그 데이터가 해당 프로세스를 처리할 때 성능저하가 나타나는지 검증해야 한다. 데이터가 대량이고 성능이 저하될 것으로 예상되면 다음을 고려하여 역정규화 대상을 판단한다.

검토대상 설명
범위처리빈도수 조사 접근하는 프로세스의 수가 많고 항상 일정한 범위만을 조회하는 경우
대량 처리범위 조사 대량 데이터를 자주 처리하여 처리범위를 일정하게 줄이지 않으면 성능을 보장할 수 없을 경우
통계성 프로세스 조사 통계성 프로세스에 의해 통계정보를 필요로 할 때 별도 통계테이블을 생성
테이블 조인 개수 테이블에 지나치게 많은 조인이 걸려 데이터를 조회하는 작업이 기술적으로 어려운 경우

(2) 다른 방법유도 검토

역정규화 적용시 데이터 무결성을 깨뜨릴 수 있으므로 역정규화를 결정하기 이전에 성능을 향상시킬 수 있는 다른 방법을 모색한다.

검토대상 설명
뷰 테이블 많은 조인으로 데이터를 조회하는 작업이 기술적으로 어려운 경우 뷰를 사용
클러스터링 적용 조회가 대부분이고 인덱스를 통한 성능 향상이 불가능한 경우
인덱스 조정 인덱스 조정으로 충분한 성능을 확보할 수 있는 경우
파티셔닝 적용 특정기준에 따라 물리저장공간이 구분될 수 있고 트랜잭션에 일정한 기준이 있는 경우
애플리케이션 로직 수정 메모리 영역에 데이터 처리를 위한 값을 캐쉬

(3) 역정규화 적용

역정규화의 대상은 테이블, 속성, 관계이며, 테이블과 속성, 관계를 중복으로 가져가는 방법만이 역정규화가 아니고 테이블, 속성, 관계를 추가할 수도 있고 분할할 수도 있으며 제거할 수도 있다. 성능을 향상시킬 수 있는 포괄적인 방법으로 역정규화를 수행하는 것이 전문화된 역정규화 기법이다.

  • 테이블 역정규화
역정규화기법 내용
1:1관계 테이블 병합 1:1 관계를 통합하여 성능 향상
1:N관계 테이블 병합 1:N 관계를 통합하여 성능 향상
슈퍼/서브타입 테이블 병합 슈퍼/서브 관계를 통합하여 성능 향상
테이블 수직 분할 트랜잭션이 처리되는 유형을 파악하여,
디스크 I/O를 분산처리하기 위해 속성 단위로 테이블을 분리하여 성능 향상
테이블 수평 분할 로우 단위로 집중 발생되는 트랜잭션을 분석하여,
디스크 I/O 및 데이터접근의 효율성을 향상시키기 위해 레코드단위로 테이블을 분리
중복테이블 추가 다른 업무 혹은 다른 서버인 경우 동일한 테이블구조를 중복 정의하여 원격조인 제거
통계테이블 추가 SUM, AVG 등 집계 값을 미리 계산하여 조회시 성능 향상
이력테이블 추가 마스터 테이블에 존재하는 레코드를 중복하여 이력테이블에 존재시키는 방법
부분테이블 추가 디스크I/O를 줄이기 위해 자주 이용하는 속성들만을 모아 별도의 역정규화 테이블 생성
  • 속성 및 관계 역정규화
역정규화기법 내용
중복속성 추가 조인에 의한 성능저하를 예방하기 위해 중복된 속성을 추가(테이블 간 조인 감소)
파생속성 추가 트랜잭션 처리 시점에 계산에 의한 성능저하를 예방하기 위해 미리 값을 계산하여 속성에 보관
이력테이블 속성 추가 불특정 NULL 조회나 최근값을 조회할 때 나타날 수 있는 성능저하를 예방하기 위해 이력테이블에 기능성 속성 추가(최근값 여부, 시작/종료일자 등)
PK에 의한 속성 추가 복합의미를 갖는 PK를 단일속성(복합식별자)으로 구성한 경우 PK안에 데이터가 존재하지만 성능 향상을 위해 일반속성으로 추가
애플리케이션 오작동을 위한 속성 추가 프로그램/사용자 오류시 원복을 위해 이전 데이터를 임시적으로 중복하여 보관(이력데이터 모델로 풀어내면 역정규화가 아닌 정상적인 데이터 모델 기법)
중복관계 추가 서로 먼 친척 간에 조인관계가 빈번하여 성능저하가 예상되는 경우 추가적인 관계(관계의 역정규화)를 맺어 성능 향상 도모


대량 데이터의 성능

한 테이블에 데이터가 대량으로 집중되거나 한 테이블에 여러 개의 속성이 존재하여 디스크에 많은 블록을 점유하는 경우 성능저하를 유발한다. 많은 양의 데이터가 예상되면 파티셔닝의 적용은 필수적으로 파티셔닝 기준을 나눌 수 있는 조건에 따라 적절한 파티셔닝 기법을 선택하여 성능 향상을 도모한다.

한 테이블에 대량의 데이터 존재

  • 인덱스의 트리구조가 너무 커져 데이터를 처리(삽입/갱신/삭제/조회)할 때 디스크 I/O를 많이 유발한다.
  • 인덱스 생성시 인덱스의 크기(용량)가 커지고, 인덱스를 찾는 단계가 깊어져 조회 성능에도 영향을 미친다. 삽입/갱신/삭제 트랜잭션의 경우 더 많은 성능 저하를 유발한다.

한 테이블에 대량의 속성 존재

  • 데이터가 디스크의 여러 블록에 존재하므로 디스크에서 데이터를 읽는 I/O양이 많아져 성능이 저하된다.
  • 많은 칼럼수는 로우 체이닝(Row Chaining)과 로우 마이그레이션(Row Migration)을 야기한다.
    • 로우 체이닝: 데이터 블록 하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐 하나의 레코드가 저장된 형태
    • 로우 마이그레이션: 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈공간을 찾아 저장하는 방식

파티셔닝기법 적용

테이블에 많은 양의 데이터가 예상되는 경우 파티셔닝을 적용하거나 PK에 의한 테이블 분할을 적용한다. Oracle의 경우 크게 RANGE PARTITION, LIST PARTITION, HASH PARTITION, COMPOSITE PARTITION 등이 가능하다.

  • RANGE PARTITION

    • 대상 테이블이 날짜 또는 숫자값으로 분리 가능하고 각 영역별로 트랜잭션이 분리되는 경우 적용
      e.g. PK(요금일자 + 요금번호) $\rightarrow$ 테이블(요금_YYMM, 요금_1901, 요금_1902, … 요금_1912)
    • SQL 처리시 요금테이블을 마치 하나의 테이블처럼 사용하지만, DBMS 내부적으로는 WHERE절에 비교된 요금일자에 의해 각 파티션에 있는 정보를 찾아가 처리하므로 성능이 개선된다.
    • 데이터보관주기에 따라 테이블의 데이터를 쉽게 지울 수 있다. (특정월의 파티션 테이블을 DROP)
  • LIST PARTITION

    • 핵심적인 코드값 등으로 PK가 구성된 경우 적용
      e.g. PK(사업소코드 + 고객번호) $\rightarrow$ 테이블(고객-사업소코드, 고객-서울, 고객-부산…)
    • RANGE PARTITION처럼 데이터 보관주기에 따라 쉽게 삭제 불가
  • HASH PARTITION
    • 지정된 hash조건에 따라 알고리즘이 적용되어 테이블이 분리
    • RANGE PARTITION처럼 데이터 보관주기에 따라 쉽게 삭제 불가


슈퍼타입/서브타입 모델의 성능

슈퍼타입/서브타입은 공통의 부분을 슈퍼타입으로 모델링하고 공통으로부터 상속받아 다른 엔터티와 차이가 있는 속성에 대해서는 별도의 서브엔터티로 구분하여 업무의 모습을 정확하게 표현하면서 물리데이터 모델로 변환시 선택의 폭을 넓힐 수 있는 장점이 있다.

슈퍼타입/서브타입 데이터 모델 변환타입 비교

구분 One to One Plus Type Single Type
특징 개별 테이블 유지
(엔터티 간 1:1관계 유지)
슈퍼+서브타입 테이블 하나의 테이블
(All in One)
확장성 우수 보통 나쁨
조인성능 나쁨 나쁨 우수
I/O량 성능 좋음 좋음 나쁨
관리용이성 좋지 않음 좋지 않음 좋음(1개)
트랜잭션에 유형에 따른 선택 개별 테이블로 접근 多 (슈퍼+서브) 형식으로 데이터 처리시 전체를 일괄적으로 처리시


PK/FK 속성 순서와 성능

PK순서는 인덱스 정렬구조를 이해한 상태에서 인덱스를 효율적으로 이용할 수 있도록 지정해야 한다. 물리테이블에 FK제약 존재시 반드시 FK인덱스를 생성하도록 하고, FK제약이 없을시 FK인덱스를 생성하는 것을 기본정책으로 한다.

  • 여러 속성이 하나의 인덱스로 구성되어 있을 때, 앞쪽에 위치한 속성 값이 상수값(‘=’) 혹은 범위(‘<>’, BETWEEN)로 있어야 인덱스를 이용할 수 있다.
  • 온라인성 업무에서는 인덱스 수를 가급적 7~8개가 넘지 않도록 하는 것이 좋다.
-- TABLE: 입시마스터(PK: 수험번호 + 년도 + 학기)

CREATE UNIQUE INDEX 입시마스터_I01 ON 입시마스터(수험번호, 년도, 학기);
SELECT COUNT(수험번호) FROM 입시마스터 WHERE 년도 = '2008' AND 학기 = '1';

Execution Plan -- 년도가 수험번호 뒤에 있어 테이블 풀 스캔 발생
0 SELECT STATEMENT Optimizer = ...
1 0 SORT(AGGREGATE)
2 1 TABLE ACCESS(FULL) OF '입시마스터'

-- PK 속성 순서 변경: (수험번호 + 년도 + 학기) -> (년도 + 수험번호 + 학기)


분산형 데이터베이스의 성능

분산 데이터베이스는 빠른 네트워크를 이용하여 데이터베이스를 여러 지역의 여러 노드로 위치시켜 사용성/성능 등을 극대화 시킨 데이터베이스이다.

분산형 데이터베이스의 투명성

  • 분할 투명성(단편화): 하나의 논리적 릴레이션이 여러 단편으로 분할되어 각 사본이 여러 사이트에 저장
  • 위치 투명성: 사용하려는 데이터의 저장 장소 명시 불필요
  • 지역사상 투명성: 지역 DBMS와 물리적DB 사이의 맵핑 보장
  • 중복 투명성: DB객체가 여러 사이트에 중복되어 있는지 알 필요가 없는 성질
  • 장애 투명성: DBMS 장애와 무관한 트랜잭션의 원자성(All or Nothing) 유지
  • 병행 투명성: 다수의 트랜잭션 동시 수행시 결과의 일관성 유지
Share